#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gcrypt.h>



int main(void)
{ 
  unsigned long longueurTexte, index;
  gcry_cipher_hd_t crypteur;
  gcry_error_t codeErreur;
  char cle[]       = "australopithequewxcvbnqs"; /* 24 caracteres, soit 192 bits */ 
  char iniVector[] = "zofulnihvrvepknf"; 
  char texteACrypter[] = "123456789 abcdefghijklmnopqrstuvwzyz ABCDEFGHIJKLMNOPQRSTUVWZYZ";
  char *resultatCryptage, *resultatDecryptage;
  
  
  longueurTexte = strlen(texteACrypter)+1; /* on inclut le '\0' dans le compte */
  resultatCryptage = (char *) malloc(longueurTexte);
  resultatDecryptage = (char *) malloc(longueurTexte);
  

  printf("cle            = %s\n", cle);
  printf("iniVector      = %s\n", iniVector);
  printf("texteACrypter  = %s\n", texteACrypter);
  printf("en hexadecimal = ");
  for (index = 0; index<longueurTexte; index++)
    printf("%02X", (unsigned char)texteACrypter[index]);
  printf("\n");
  

  
  /* Initialisation du crypteur : choix de l'algorithme AES -128- 192, et donc 
     choix d'une cle de -128- 192 bits */
  
  codeErreur = gcry_cipher_open(&crypteur, GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_ECB, 0);         
  if (codeErreur != 0)
    {
      printf("gcry_cipher_open a echoue:  %s/%s\n", gcry_strsource(codeErreur), gcry_strerror(codeErreur));
      return 1;
    }
  printf("gcry_cipher_open    a fonctionne\n");
  
  
  codeErreur = gcry_cipher_setkey(crypteur, cle, 24);
  if (codeErreur != 0)
    {
      printf("gcry_cipher_setkey a echoue:  %s/%s\n", gcry_strsource(codeErreur), gcry_strerror(codeErreur));
      return 1;
    }
  printf("gcry_cipher_setkey  a fonctionne\n");



  
  /* Encryptage du texte (1): choix du vecteur d'initialisation */
  
  codeErreur = gcry_cipher_setiv(crypteur, iniVector, 16);
  if (codeErreur != 0)
    {
      printf("gcry_cipher_setiv a echoue:  %s/%s\n", gcry_strsource(codeErreur), gcry_strerror(codeErreur));
      return 1;
    }
  printf("gcry_cipher_setiv   a fonctionne\n");
  
  
  
  /* Encryptage du texte (2) : encryptage proprement dit */
  
  codeErreur = gcry_cipher_encrypt(crypteur, resultatCryptage, longueurTexte, texteACrypter, longueurTexte); 
  if (codeErreur != 0)
    {
      printf("gcry_cipher_encrypt a echoue:  %s/%s\n", gcry_strsource(codeErreur), gcry_strerror(codeErreur));
      return 1;
    }
  printf("gcry_cipher_encrypt a fonctionne\n");


  printf("resultatCryptage = ");
  for (index = 0; index < longueurTexte; index++)
    printf("%02X", (unsigned char)resultatCryptage[index]);
  printf("\n");
  
  
  /* Decryptage du texte */
  
  codeErreur = gcry_cipher_decrypt(crypteur, resultatDecryptage, longueurTexte, resultatCryptage, longueurTexte);   if (codeErreur != 0)
    {
      printf("gcry_cipher_decrypt a echoue:  %s/%s\n", gcry_strsource(codeErreur),gcry_strerror(codeErreur));
      return 1;
    }
  printf("gcry_cipher_decrypt a fonctionne\n");

  
  
  printf("resultatDecryptage = %s\n", resultatDecryptage);
  


  /* Fermeture du crypteur et liberation de la memoire allouee dynamiquement */

  gcry_cipher_close(crypteur);
  free(resultatCryptage);
  free(resultatDecryptage);
  
  return 0;
}


